检查开发板：
    1、网线
    2、电源
    3、USB转串口
    4、SD卡
    5、开发板

任务：
    1、试用开发板
    2、阅读用户手册

搭建开发板的开发环境：
    1、安装USB转串口的驱动，安装完成后重启。
        查看串口信息，设置编号，设置波特率。
        右击此电脑->管理->设备管理器->串口->USB-to-Serial->右击属性->端口设置->设置波特率115200->高级->选择串口编号。
    2、安装串口通信工具(putty、dnw)
        以putty为例，选择串口，115200，会话名，保存，双击打开会话
        此等待与开发板通信，长按电源键，如果不出错则有字符显示。
    3、安装SD卡烧写工具
        右击以管理员身份运行，如果无法运行，则安装vsc++2008运行库。
        从image中下载led_image.bin到本机，然后把SD卡插入到电脑中。
        点击Browse选择下载的led_image.bin，然后点击ADD，然后点击START，开始烧写。
        把SD卡插入到开发板的靠近按键的卡槽中，然后长按电源键。
    4、安装交叉编译器
        复制arm-2009q3-tar.bz2到ubuntu系统，在主目录下解压。
        在终端中进入arm-2009q3/bin目录下，使用pwd获取当前路径，然后复制。
        sudo vim /etc/environment，把刚才的路径粘贴到PATH的最前面，用:分隔，保存退出。
        在终端执行 source /etc/environment 重新加载环境变量配置文件。
        执行命令 arm-none-linux-gnueabi-gcc -v 查看交叉编译器的版本信息。
        注意：64位的虚拟机安装下列工具
        sudo apt-get install lib32c-dev  
        sudo apt-get install lib32stdc++6  

开发板介绍：
    1、x210v3s，由深圳九鼎创展生产，目前已经停产。
    2、CPU由三星公司生产叫S5PV210，目前已经停产。
    3、S5PV210采用ARMv7架构CortexTM-A8系列。
    4、支持android4.0和android2.3，Qt4.8。
    5、启动设置：
        拨码开关在下：通过USB口启动，
        拨码开关在上：是通过SD卡启动，优先内置的SD卡（硬盘），如果内置的SD卡，没有启动信息，则会从外置的SD卡启动。
    6、串口：
        CPU带了四串口接口，但此开发板只外接了两个串口（UART0和UART2）。
        注意，默认 andorid2.3,WINCE 使用 uart0 作为调试串口，android4.0 和 linux 使用 uart2 作为调试串口。
    7、SD卡槽：
        有两个SD卡槽，只有右侧可以使用。
    8、LED和蜂鸣器：
        一个蜂鸣器，有5个LED，其中一个电源指示灯。
        用于调试程序。
    9、电源：
        此开发板采用了电源管理芯片，长按3秒才能开机。
        如果没有电源锁定程序，松开后会立即断点。
        
什么是嵌入式：
    是以应用为中心，以计算机技术为基础，软硬件可裁剪，适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
    1、计算机设备，遵守冯·诺依曼体系结构。
        1、运算器
        2、控制器
        3、存储设备(内存)
        4、输入设备
        5、输出设备
    2、操作系统
        因为嵌入式设备是一种专用性很强的计算机，
        不是标准的操作系统，需要适当的进行裁剪（移植）。
    3、嵌入式软件工程师
        也是在操作的基础进行编程，调用系统接口、C/C++标准库、第三库（Qt/MySQL/Madplay）。
        但要求更要，一般嵌入式设备的资源有限（存储设备、电量、运算速度）、环境恶劣。
    4、嵌入式的开发模式
        由于嵌入式的特殊性可能暂时没有操作系统，或者硬件的的速度慢无法运行开发工具，因此只能在PC机下写好代码，然后编译，下载、烧写的方式到嵌入式设备中运行。
        普通的开发模板：A计算机开发，A计算机运行
        嵌入式的开发模式：A计算机开发，编译出B计算机可以运行和程序，把可执行程序放在B计算机上运行，这种叫做交叉编译。
    
    
        






















一、嵌入式系统的构成
    软件：
        应用程序
        第三方库（Qt，libc，myclient）
        操作系统：
            引导程序
            内核+驱动
            文件系统
    硬件：
        底板：
            外置芯片
                网卡（DM9000）
                声卡
                ADC
                电源
                USB
            接口：
                串口
                SD
                LCD+触摸屏
                摄像头
                按键
        核心板：
            Soc(CPU+uart+timer)
            DDR
            Nand
        
二、嵌入式系统的演进方式
    1、以单芯片为核心、可编程控制器形式存在的
        没有操作系统支持
        软件以汇编为主
        功能单一、处理效率低、存储器容量小、没有外部接口
        使用简单、价格低
        单片机
    2、以嵌入式CPU为基础，简单操作系统为核心
        CPU种类多、通用性弱
        系统开销小，效率高
        具有一定的兼容性和扩展性
        用户的体验不好，交互界面不够友好
    3、以嵌入式操作系统为标志
        兼容性好，适用于不同的平台
        系统开销小、效率高、具有高度模块化及拓展性
        图形界面、用户界面友好
        
    4、以物联网为标志
        以5G为基础，将传感器技术与传统的嵌入式技术相结合
        小型化、智能化、网络化、可视化、低功耗、绿色环保
        多核技术、云计算、大数据、人工智能相结构

三、ARM处理器介绍
    1、发展历史
        ARM的前身是艾康电脑，于1978年成立于英国剑桥。
        1980年苹果公司与艾康电脑合作开发新版的CPU，于1985年发布了全球第一款商用RISC处理器。
        1990年艾康电脑财务危机，接受苹果公司的投资，分割出独立子公司ARM（Advanced RISC Machine）。
        之后发布了一系统的RISC处理器设计方案。
    2、商业模式和生态系统
        ARM之前的半导休行业
            Intel、ADM、Motorola这些公司都是自己设计IC，自己设计芯片、自己生产、自己销售。
        ARM的商业模式
            ARM只负责IC设计，销售自己的IP设计
        自己不生产芯片，而是把IP设计授权其它的半导体生产商，收取专利费。
            因此严格来说ARM不是半导休厂商，而是一家设计公司。
        ARM的启示
            1、不要抱怨劣势，有时候反而可能是机会。
            2、想成功，要先学习帮助别人，成全别人。
            3、一个成熟社会的标志就是分工不断的细化。
    3、为什么选择三星
        1、在中国的使用广泛，有良好的企业应用基础。
        2、学习资料多，便于学习。
        3、开发板和方案多，软硬件平台好找。
        4、体系典型，适用于学习。

四、ARM的体系结构
    1、ARM的工作模式
        用户模式
        系统模式
        快速中断模式
        外部中断模式
        特权模式
        快速模式
        未定义模式
        除用户模式外，其它被称为特权模式
        用户模式和系统模式外，其它被称为异常模式
    2、ARM的寄存器
        一共37个寄存器，用户模式和系统模式可以使用17个，其它模式可以使用18个（17+状态寄存器的备份）。
        r0~r7：所有模式共用
        r8~r12：快速中断模式有它私有的，其它模式共用。
        r13~r14：用户模式和系统模式共用，其它模式有私有的。
        r15、cpsr：所有模式共用
            r15也叫pc：程序计数器，它记录着下一条要执行的程序，可以被赋值，这样就实现了跳转。
            cpsr：用户来记录上一条指令的执行状态，进位、溢出、零、负数、当前模式，只有12位有效，其它位目前保留。
        spsr：用户模式和系统模式下没有，其它模式有私有的。
            与cpsr的格式一样，它是用来备份用户模式和系统模式的cpsr。
         
五、流水线
    一条指令的执行需要六个步骤：
        1、取指
        2、译码
        3、取数
        4、计算
        5、存储
        6、回写
    如果只是按顺序执行，那么执行其中一项操作时其它硬件都处于空闲状态，因此ARM引入了流水线的概念，每个控制单元只负责干一件事情，这样理论上，三级流水线就提高了三倍的性能，而5级流水线就提高了五倍的性能。
    但实际情况其实达不到，因为流水线会被打断、暂停。
    比如：
        bl func //跳转指令
        ldr r0,[r0,#0]
        add r0,r0,r1 //在5级流水线上产生

六、ARM处理器寻址方式
    1.立即寻址：#100
    2.寄存器寻址：r0，把寄存器当变量使用
    3.寄存器间接寻址：[r0]，把寄存器当指针变量使用，*r0
    4.寄存器偏移寻址：r0 << n，对寄存器进行左移或右移操作
    5.基址变址寻址：[r0,#1]，相当于对指针变量进行加减操作，*(r0+1);
    6.多寄存器寻址：寄存器的批量操作，类似于数组初始化操作
    7.堆栈寻址：在ARM汇编语句中也可以使用堆内存和栈内存，但前提是要设置好堆内存和栈内存的基地址，然后就可以向堆内存和栈内存读取、写入数据。
七、ARM指令集
    1、ARM指令的格式
        <opcode> {<cond>}{S} <Rd>,<Rn> <operand2>...
        opcode 指令码
        cond 条件码
        S 是否影响状态寄存器
        Rd 目标寄存器
        Rn 源寄存器
        {} 可以省略，而<>必须要有的
    2、RM指令条件执行及标志位
        CMP会自动把比较结果存储到状态寄存器
        而数据处理指令需要在指令反加S才会把计算结果存储到状态寄存器。
        EQ 相等
        NE 不等
    3、跳转指令
        B 目标地址，是一种相对地址跳转，在当前地址的基础上加一个偏移值，进行跳转，这种跳转速度比较快，但是跳转的范围有限，正负32M以内。
        BL 目标地址，是一种绝对地址跳转，需要是完整的一个地址，在跳转前会把下一条指令的地址存储到r14中，然后跳转到目标位置执行，当执行完成后可以从r14中恢复到pc中，这样就实现了返回。
        BLX 功能与BL类似，但会从ARM（32位状态），切换到Thumb（16位状态）。
        BX 功能与B类似，但会从ARM（32位状态），切换到Thumb（16位状态）。

    4、数据处理指令
        MOV r0,#100 <=> r0 = 100
        MOV R1,R3,LSL,#3 <=> r1 = r3 << 3
        MVN r0,#100 <=> r0 = ~100
        ADD r0,r1,#110 <=> r0=r1+110
        SUB R0,R0,#1 <=> r0-=1 反减
        RSB R3,R1,#0xFF00 <=> r3=0xff00-r1
 
        ADDS R1,R1,R2 
        ADC R0,R0,R2 带进位的加
        
        SUBS R0,R0,R2
        SBC  R1,R1,R3 带借位的减

        RSBS R2,R0,#0
        RSC  R3,R1,#0 带借位的反减

        AND R0,R0,#3 <=> r0 = r0&3
        ORR R0,R0,#3 <=> r0 = r0|3
        EOR R1,R1,#3 <=> r1 = r1^3
        BIC R0,R0,#3 <=> r0 = r0&(~3)
        CMP R1,R0 把两个数的比较结果影响状态寄存器
        CMN R1,R0 把两个数求反后比较，并把比较结果结果影响状态寄存器
        TST R0,#0x01 把两个数进行按位与操作，并把计算结果影响状态寄存器
        TEQ R1,R2 把两个数进行按位异或操作，并把计算结果影响状态寄存器
    5、程序状态寄存器传输指令
        MRS R7,CPSR 把当前模式的状态寄存器备份到r7
        MSR CPSR_cxsf,R3 把数据写入到状态寄存器
            [31:24] 为条件标志位域，用f表示
            [23:16] 为状态位域，用s表示
            [15:8]  为扩展位域，用x表示
            [7:0]   为控制位域，用c表示
    6、Load、Store指令
        Load 从内存加载数据到寄存器
            LDR R0,#8
            LDR R0,[R1,#8] <=> r0 = *(r1+8);
            DMFD R13,{R0,R4‐R12,LR}
            
        Store 把寄存器中的数据写到内存
            STR #8,R0
            STR R0,[R1,#8]  *(r1+8) = r0
            STMFD R13,{R0,R4‐R12,LR}
        SWP r0,r1,r2 <=> r0 = r2; r2 = r1;
    7、中断指令
        SWI 0-16777215 一旦这条指令就会进入中断模式。

电源锁定：
    1、找到厂家提供的代码，保存为start.S文件。
    start:
        ldr  r0, =0xe010e81c
        ldr  r1, [r0]
        orr  r1, r1, #0x300
        orr  r1, r1, #0x1
        str  r1, [r0]
    2、生成目标代码
        arm-none-linux-gnueabi-gcc -c start.S ->start.o
    3、生成可执行文件（设置代码段、不加入启动代码、不加入标准库）
        arm-none-linux-gnueabi-gcc -Ttext 0xd0020010 -nostartfiles -nostdlib start.o -o lock
    4、从可执行文件中拷贝出纯二进制指令
        arm-none-linux-gnueabi-objcopy -O binary lock lock.bin
    5、编译出添加校验和的工具（研究一下，明天我们自己写一份）
        gcc mkv210_image.c -o mkv210
    6、为lock.bin添加校验和
        ./mkv210 lock.bin lock_image.bin
    7、把添加校验和后的文件烧写到SD卡中执行，效果：开发板能够持续供电。

























一、常用的存储介质
    内存：
        SRAM：静态随机存储器，容量小，但价格高，不需要初始化上电直接使用，在使用过程中不需要做一维护操作。
        DRAM：动态随机存储器，容量大，价格低，上电后不能直接使用，需要初始化，在使用过程中需要一些刷电操作，DDR，LDDR。
        IROM：ROM只读存储器，IROM用于存储指令的只读存储器，一般用于固化一些初始化程序。
    外存：
        NorFlash：容量小，价格高，优点是可以与CPU的总线直接相连，CPU上电后可以直接读取，因此可以用作启动介质。
        NandFlash：（硬盘），容量大，价格低，缺点是不能总线式访问，也就是不能在CPU上电后直接使用，协议、时序复杂，一般都通过一个单独的控制器进行读写操作。 
二、各大类计算机的启动方式
    PC：小容量的NorFlash+大容量的硬盘+大容量的DRAM
    单片机：小容量的NorFlash+小容量的SRAM
    嵌入式：大容量的DRAM+大容量的NandFlash+Soc内置少量的SRAM
    S5PV210：大容量的DRAM+外接大容量的NandFlash+Soc内置少量的SRAM+Soc内置少量的IROM。
三、S5PV210的启动顺序
    通过S5PV210_iROM_ApplicationNote可以知道S5PV210的启动过程分为5大步骤：
        1、BL0(从Nand拷贝小于96KB的程序到SRAM，然后跳转到BL1)
        2、BL1（唤醒尝试闲置状态的SRAM，检查是是否是安全启动模式，然后跳转到BL2）
        3、BL2（运行SRAM中的程序，初始化DRAM）
        4、从Nand拷贝OS到DRAM
        5、DRAM启动操作系统
    三星在S5PV210中固化一段程序到iROM中，负责完成一些初始化工作。
        1、关闭看门狗定时器
        2、初始化高速缓存
        3、初始化栈内存基地址
        4、初始化堆内存基地址
        5、初始化块设备拷贝函数
            通过函数指针实现的回调模式。
            调用代码已经实现，而具体的函数功能还没有实现出来。
        6、初始化系统时钟
        7、拷贝BL1程序到SRAM内存
        8、检查前16个字节，BL1程序的校验和。
        9、检查是否是安全启动模式
        10、跳转到BL1位置执行

练习：实现计算校验和和功能。
    1、准备16kb的缓冲区
    2、缓冲区前16个字节，先定写入****************。
    3、从文件中读取内容，读取缓冲区16个字节后。
    4、把读取的内容，每个字节相加到一个8字节的整数，然后把它写入到8~15处。
    5、把缓冲区里的所有内存到新文件中。
      
四、GPIO介绍
    GPIO即通用输入/输出接口，简称GPIO。
    优点：低功耗、封装小、成本低、快速上市。
    
五、GPIO的寄存器
        GPx0CON 控制寄存器，用于设置GPIO接口的工作模式
            0000 = Input 
            0001 = Output
            0010 = 特殊功能
            0011 ~ 1110 = Reserved
        GPx0DAT 数据寄存器
            根据控制寄存器的配置，来决定DAT寄存器的用法。
            Input 读取DAT中的数据，用来获取外部处于什么状态。
            Output 向DAT写入数据，写入0则输出低电流，写入1则输出高电流。
        GPx0PUD 上/下拉电阻寄存器
            上/下拉电阻寄存器的作用，当GPIO接口既不输入也不输出，的状态，然后就可以产拉电阻，让电路处于高阻状态，相当于电路是断的。

六、通过GPIO控制LED
    1、通过阅读电路原理图找到硬件具体的接口。
    2、通过阅读核心版电路图找到接口对应的GPIO编号。
    3、阅读CPU芯片手册，找到对应地址，计算出相应的位以后要赋值的数据。

        GPJ0_3 接口要处于低电流状态，然后LED灯才会亮。
        GPJ0CON Address = 0xE020_0240 
            [13~15]位 在不改变其它二进制位的情况下赋值为:0001b
        GPJ0DAT Address = 0xE020_0244
            [3]位 在不改变其它二进制位的情况下赋值为:0，让GPJ0_3输出低电流
        GPJ0PUD Address = 0xE020_0248
            [6~7]位 在不改变其它二进制位的情况下赋值为:00，禁用上/下拉电阻。

七、汇编语言调用C函数
    C代码的执行需要内存划分局域，可以借助链接脚本来规划内存的分布。

    链接地址：我们希望程序在什么地址下执行，然后编译时编译就会以此地址计算相关跳转语句。
    运行地址：程序实际运行时，所在的地址，运行地址如果和实际地址不匹配可能会出现跳转错误。
    链接脚本能干什么：链接脚本就是一个规则文件，可以用它来指挥链接器的工作，链接器会根据链表脚本中的内存，合并目标文件，最终生成可执行程序。
    链接脚本内容：
        SECTIONS{ //所有内容都会被它包含
            .代表当前位置
            = 用来赋值
            .text 表示代码段
            .data 表示数据段
            .bss  表示静态数据段
        }
    
   
    
























一、串口通信的优点
    串口通信以字节为单位收发数据，但确是使用一根线收一要线发，这样的好处是可以传输的距离很远，而且通信简单。
    串口通信是嵌入式开发中非常常用的调试设备的方式。

二、串口通信的重要参数
    1、波特率：该参数表示串口每秒传输的比特位数。
        常用9600、115200，通信时传输距离越长，波特率就要越低。
    2、数据位
        表示在收到的数据包中，单纯的数据点多少位，如果仅传输标准的ASCII表中的字符（0~127），那么7位就够，如果是带扩展的则需要8位（0~255）。
    3、奇偶校验位
        通过统计数据中的高或低的个数，来实现数据检验的一种方式。如果常见的检测方式有：偶校验、奇校验、标记等方式。
    4、停止位
        用于标志一个数据的传输结构，可以取1位或者两位，它不仅标志着数据包的传输结束，也给通信双方提供的校正时钟的机会。
    5、流控制
        在双方通信时，由于速度不匹配，比如发送方比接收方速度快，这样可能会造成接收方缓冲区中的数据还没有读取，新的发送数据再次来临，这样就会造成数据被覆盖。
        所谓的流控制就增加一个响应消息，用于标志接收方是否读取缓冲区里的数据。

二、通用异步接收器
    UART（通用异步接收器）：是一种通用的串行数据总线，用于异步通信，总共有四个单元组成，分别是波特率发生单元、控制单元、发送器、接收器。
    volatile
    UART寄存器：
        1、收发数据的GPIO接口的工作模式设置。
            GPA1CON, R/W, Address = 0xE020_0020
        2、ULCON2, R/W, Address = 0xE290_0800
            不使用红外线传输
            无奇偶校验
            1个停止位
            8个数据们
        3、UCON2, R/W, Address = 0xE290_0804
            读取模式选择中断或轮询
            发送模式选择中断或轮询
            不发生中断信息
            确定使用轮询
            错误处理不使用中断
            超时不产生中断
            读取数据中断、发送数据中断
            时钟选择默认
            DMA的读写缓冲区大小采用默认
        4、UTRSTAT2, R, Address = 0xE290_0810
            读缓冲区是否为空
            发送是否完成
        5、UTXH2, W, Address = 0xE290_0820
            发送缓冲，直接把要发送的数据写入此寄存器
        6、URXH2, R, Address = 0xE290_0824
            接收到的数据会存储到此寄存器中
        7、UBRDIV2, R/W, Address = 0xE290_0828
             DIV = (时钟频率 / (波特率 x 16)) -1
        8、UDIVSLOT2, R/W, Address = 0xE290_082C
            UBRDIV2、UDIVSLOT2配合设置波特率
            (时钟频率 / (波特率 x 16))-1结果的小数部分*16，
            

























一、中断的基本概念
    1、什么是中断
        当计算机在执行程序时，当出现异常情况（信号），计算机停止当前程序的运行，转而去处理异常情况，处理完成后再返回继续执行，这种情况叫中断。
    2、中断的处理过程
        在S5PV210中，ARM设计了一个完成的中断系统，中断程序独立于主程序之外，中断响应过程是：
        1、主程序正常在执行，中断事件、中断源产生一个中断请求。
        2、CPU接收到中断请求后，将主程序暂停，产生一个中断点。
        3、中断系统响应中断请求，转而执行中断服务程序。
        4、执行完成中断响应程序后返回到主程序的中断点处，继续执行主程序。
    3、中断系统的优点
        现在绝大多数的嵌入式芯片都具有中断系统，使用它的好处：
        1、实现实时处理，根据CPU的内部功能模块（硬件上的）来响应中断请求，为其服务，不需要主程序做任务的监控，因此可以实时处理任务。
        2、实现分时操作，根据需要设计若干个中断源，这样就可以同时响应多个外部设备的中断请求，只有在外部设备产生中断时，CPU才转而为它服务，这样可以让多个外部设备同时工作，实现分时操作。
        3、故障处理，与轮询模式相比，中断处理异常情况、或故障时会更及时，可以实现紧急故障及时处理。
        4、待机唤醒，嵌入式设备最大的一个特点就是低功耗，因此就需要具有休眠的功能，而从休眠状态快速切换到正常工作模式，就是通过中断实现的。
            
    4、中断源、中断信号、中断向量
        中断源：顾名思义，就是能够产生中断的源头（能够产生中断的一些内设或外设），S5PV210中有128个中断源，但有一些是空的，如：定时器、串行通信、数模转换器。
        
        中断信号：
            1、脉冲信号（上升或下降）
            2、电平信号（高电平或低电平）
            3、电平变化（高电平转低电平或低电平转高电平）
    
        中断向量：
            也叫异常向量，以CPU规则一个位置用于存储各异常模式的响应位置，而每个模式占4字节，因此无法直接存储异常响应程序，而只能存储一个地址，该地址指向真正的异常响应程序。
    
    
二、SDRAM内存
    1、SDRAM简介
        同步动态随机存取内存（synchronous dynamic random-access memory）简称SDRAM。
        DDR：就是DDR SDRAM，是SDRAM的升级版，意思是双倍速的SDRAM。
        DDR有好多种代：DDR1、DDR2、DDR3、DDR4、LPDDR（低功耗的LPDDR）。
    2、SDRAM的特性
        SRAM （静态随机存取存储器）：只需要保持通电即可，在使用过程中不需要做额外的操作，而SRAM在使用过程中需要每隔一段赶时间进行刷新一次，这样的就浪费了大量的时间。
        SRAM：容量小、价格高、速度快、上电就可用、掉电丢失、随机读写、总线式访问。
        SDRAM：容量大、价格低、动态刷新、需要初始化、速度慢、掉电丢失、随机读写、总线式访问。
        由于SRAM和SDRAM的特性，所以就导致启动过程比较怪异、复杂，我们在裸机阶段学习一些硬件其实是为了学习uboot做准备，而学习uboot是为了学习内核，而学习内核的目的是为了编写驱动程序还有学习内核中优秀的代码、算法。
        
    3、SDRAM芯片介绍
        PS：芯片的发展趋势，把很多外部芯片的功能集成到CPU内部形成SOC
        SDRAM芯片属于外设，也就是接在CPU外面，因为SDRAM不光要频繁的读写数据还要定时刷新，所以导致SDRAM芯片的温度特别高，而SOC本身的温度就特别高，如果两者结合在一起，估计可以煎鸡蛋。
        开发板的原理上标注的是K4T1G164QQ，但实际上不是这个款芯片，而是一款与K4T1G164QQ兼容的国内半导体厂商生产的芯片。
        全球做SDRAM芯片的厂商不多，一般都是二、三线厂家向一线厂家看齐，目的是为了兼容一线厂家的芯片，然后让在意成本的厂商选择它替代一线厂家的芯片，而二、三线厂家没有创新、研发、测试的成本，因此价格比较低。
        由于这些行业现状导致SDRAM芯片的标准比较统一。
    4、原理图中的SDRAM
        由于S5PV210中只有两个DRAM接口，但通过查看原理图会发现有四个SDRAM芯片，而九鼎其实是通过并联方式把SDRAM芯片两两连接在一起，形成两个32们的内存芯片。
        DRAM0接口的范围：0x20000000~0x40000000 512M
        DRAM1接口的范围：0x40000000~0x80000000 1024M
        S5PV210一共可以支持1.5G的内存,而九鼎接的每个SDRAM芯片只有128M，也就相当两个256M，共512M内存。

三、重定位
    1、链接地址
        程序编译时指定的地址，通过-Ttext参数指定的地址，它是理论上程序在运行时所处的地址。
    2、加载地址
        程序在运行时实际所处理的地址。
        注意：链接地址与加载地址不能保障一定一样。
    3、位置有关代码
        如果程序的链接地址与加载地址不符，程序就无法运行，或运行错误这中代码叫位置有关代码。
    4、位置无关代码
        如果程序的链接地址与加载地址不符，程序依然能够正确运行，这种代码叫位置无关代码。
        可以简单的认为使用了BL的代码叫位置有关代码，而没有使用BL的叫位置无关代码。
    5、再论S5PV210的启动过程
        1、iROM中的固定程序会从SD中拷贝16~96KB的程序先进行环境初始化（设置时钟、初始化内存、开看门狗等）。
        2、然后再把剩余的程序从SD中拷贝到SDRAM中。
        3、然后把开发板上的所以资源都初始化好，为OS的运行做好准备。
        4、然后拷贝OS到SDRAM中，启动OS。
    6、什么是重定位
        而uboot为了兼容大多数CPU并不会这样，而先把uboot的前96KB拷贝到SRAM中，然后初始化，再把完整的uboot拷贝到SDRAM中。
        因此uboot的前96KB的程序就会在不同的位置运行两次，所以一定会出现链接地址与加载地址不符的情况。
        具体的做法是先把uboot拷贝到SRAM中只运行当量的位置无关代码，然后再把程序拷贝到正确的位置，种行为叫重定位。
    

    

